package feed.dao;
import feed.entity.DetalleMovimiento;
import feed.conexion.DataBaseInstance;
import static feed.conexion.DataBaseInstance.closeConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import feed.entity.DetalleMovimiento;
import java.util.ArrayList;
import java.util.List;

public class DetalleMovimientoDao {
    
    protected Connection getConnection() {
        return DataBaseInstance.getInstanceConnection();
    }
    
    public void save(DetalleMovimiento detallemovimiento) {
        PreparedStatement saveDetalleMovimiento;
        try {
            saveDetalleMovimiento = getConnection().prepareStatement(
                    "INSERT INTO APP.detallemovimiento VALUES (?, ?, ?, ?)");
            saveDetalleMovimiento.setInt(1, detallemovimiento.getIdmovimiento());
            saveDetalleMovimiento.setInt(2, detallemovimiento.getIdcuenta());
            saveDetalleMovimiento.setInt(3, detallemovimiento.getDebe());
            saveDetalleMovimiento.setInt(4, detallemovimiento.getHaber());
            saveDetalleMovimiento.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public void update(DetalleMovimiento detallemovimiento) {
        PreparedStatement saveDetalleMovimiento;
        try {
            saveDetalleMovimiento = getConnection().prepareStatement(
                 "UPDATE APP.detallemovimiento SET idcuenta = ?, debe = ?, "
                    + "haber = ? WHERE  id = ?");
            saveDetalleMovimiento.setInt(1, detallemovimiento.getIdcuenta());
            saveDetalleMovimiento.setInt(2, detallemovimiento.getDebe());
            saveDetalleMovimiento.setInt(3, detallemovimiento.getHaber());
            saveDetalleMovimiento.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void delete(DetalleMovimiento detallemovimiento) {
        PreparedStatement delDetalleMovimiento;
        try {
            delDetalleMovimiento = getConnection().prepareStatement(
                    "DELETE FROM APP.detallemovimiento WHERE id = ?");
            delDetalleMovimiento.setInt(1, detallemovimiento.getId());
            delDetalleMovimiento.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }

  public void IngresarDM(int idmov,int idcta, int debe, int haber){
       try {            
            PreparedStatement pstm = getConnection().prepareStatement("insert into " + 
                    "APP.detallemovimiento(idmovimiento, idcuenta, debe, haber) " +
                    " values(?,?,?,?)");            
            pstm.setInt(1,idmov);
            pstm.setInt(2,idcta);
            pstm.setInt(3,debe);
            pstm.setInt(4,haber);
            pstm.execute();
            pstm.close();            
         }catch(SQLException e){
         System.out.println(e);
      }
   }
    protected void closeConnection() {
        DataBaseInstance.closeConnection();
    }
    public List<DetalleMovimiento>findAll(){
        List<DetalleMovimiento> listaDetalleMovimientos = new ArrayList<DetalleMovimiento>();
        ResultSet result = null;
        try {
            String query = ("select (select a.nombre from app.tipomovimiento a where a.id=c.IDMOVIMIENTO) as nombretipo,(select d.nombre from app.CUENTA d where d.ID=c.IDCUENTA )as cuenta, debe, haber from APP.DETALLEMOVIMIENTO c");
            PreparedStatement stmt = getConnection().prepareStatement(query);
            //stmt.setString(1,"%"+nombre+"%");
            result = stmt.executeQuery();
            while (result.next()) {
                DetalleMovimiento detallemovimiento = new DetalleMovimiento();
                detallemovimiento.setNombretipo(result.getString("nombretipo"));
                detallemovimiento.setCuenta(result.getString("cuenta"));
                detallemovimiento.setDebe(result.getInt("debe"));
                detallemovimiento.setHaber(result.getInt("haber"));
                detallemovimiento.setGlosa(result.getString("glosa"));
                detallemovimiento.setNumt(result.getInt("numt"));
                listaDetalleMovimientos.add(detallemovimiento);
            }
            result.close();
            stmt.close();
            closeConnection();
        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaDetalleMovimientos;
}
    public Object [][] getDatos(){
        int posid = 0;
        try{
            PreparedStatement pstm = getConnection().prepareStatement("SELECT count(1) as total FROM APP.DETALLEMOVIMIENTO");
            ResultSet res = pstm.executeQuery();
            res.next();
            posid = res.getInt("total");
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        Object[][] data = new String[posid][5];
        try{
            PreparedStatement pstm = getConnection().prepareStatement("select id,(select a.nombre from app.tipomovimiento a where a.id=c.IDMOVIMIENTO) as nombretipo,(select d.nombre from app.CUENTA d where d.ID=c.IDCUENTA )as cuenta, debe, haber from APP.DETALLEMOVIMIENTO c");
            ResultSet res = pstm.executeQuery();
            int increment = 0;
            while(res.next()){
                String estId = Integer.toString(res.getInt("id"));
                String estNombretipo = res.getString("nombretipo");
                String estCuenta = res.getString("cuenta");
                String estDebe = Integer.toString(res.getInt("haber"));
                String estHaber = Integer.toString(res.getInt("haber"));
                data[increment][0] = estId;
                data[increment][1] = estNombretipo;
                data[increment][2] = estCuenta;
                data[increment][3] = estDebe;
                data[increment][4] = estHaber;
                increment++;
            }
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        return data;
    }
    
    public Object [][] getDatosFecha(String fecha){
        int posid = 0;
        try{
            PreparedStatement pstm = getConnection().prepareStatement("select count(1)as total from app.MOVIMIENTO where fecha='2013/11/27'");
            ResultSet res = pstm.executeQuery();
            res.next();
            posid = res.getInt("total");
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        Object[][] data = new String[posid][5];
        try{
            PreparedStatement pstm = getConnection().prepareStatement("select id,(select a.nombre from app.tipocuenta a where a.id=(select b.idtipo from app.movimiento b where b.id=c.IDMOVIMIENTO)) as nombretipo,(select d.nombre from app.CUENTA d where d.ID=c.IDCUENTA )as cuenta, debe, haber from APP.DETALLEMOVIMIENTO c");
            ResultSet res = pstm.executeQuery();
            int increment = 0;
            while(res.next()){
                String estId = Integer.toString(res.getInt("id"));
                String estNombretipo = res.getString("nombretipo");
                String estCuenta = res.getString("cuenta");
                String estDebe = Integer.toString(res.getInt("haber"));
                String estHaber = Integer.toString(res.getInt("haber"));
                data[increment][0] = estId;
                data[increment][1] = estNombretipo;
                data[increment][2] = estCuenta;
                data[increment][3] = estDebe;
                data[increment][4] = estHaber;
                increment++;
            }
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        return data;
    }
    
    public Object [][] getDatosUltimo(){
        int posid = 0;
        try{
            PreparedStatement pstm = getConnection().prepareStatement("SELECT count(1) as total FROM APP.DETALLEMOVIMIENTO where idmovimiento=(select max(id) from app.MOVIMIENTO)");
            ResultSet res = pstm.executeQuery();
            res.next();
            posid = res.getInt("total");
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        Object[][] data = new String[posid][5];
        try{
            PreparedStatement pstm = getConnection().prepareStatement("select id,(select a.nombre from app.tipomovimiento a where a.id=c.IDMOVIMIENTO) as nombretipo,(select d.nombre from app.CUENTA d where d.ID=c.IDCUENTA )as cuenta, debe, haber from APP.DETALLEMOVIMIENTO c where idmovimiento=(select max(id) from app.MOVIMIENTO)");
            ResultSet res = pstm.executeQuery();
            int increment = 0;
            while(res.next()){
                String estId = Integer.toString(res.getInt("id"));
                String estNombretipo = res.getString("nombretipo");
                String estCuenta = res.getString("cuenta");
                String estDebe = Integer.toString(res.getInt("haber"));
                String estHaber = Integer.toString(res.getInt("haber"));
                data[increment][0] = estId;
                data[increment][1] = estNombretipo;
                data[increment][2] = estCuenta;
                data[increment][3] = estDebe;
                data[increment][4] = estHaber;
                increment++;
            }
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        return data;
        
        
    }
}
